/* -*-jde-*- */
package app.alumnoe.cv.beans;

import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.util.Fecha;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Formación del alumno o egresado a partir la institución educativa
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class ExperienciaProfesional {

    /**
     * El identificador de la experiencia profesional
     */
    private int nIdExperienciaProfesional;
    /**
     * Índice del curriculum vitae
     */
    private int nIdCV;
    /**
     * Empresa en la cual se trabaja o se trabajó
     */
    private String sEmpresa;
    /**
     * El giro de la empresa
     */
    private String sGiro;
    /**
     * El máximo puesto que se obtuvo en dicha empresa
     */
    private String sPuesto;
    /**
     * La fecha de ingreso laboral
     */
    private Fecha dFechaIngreso;
    /**
     * La fecha de salida de la empresa si es el caso
     */
    private Fecha dFechaSalida;
    /**
     * Si es el puesto actual en el que se labora.
     */
    private boolean bPuestoActual;
    /**
     * Funciones desempeñadas en la empresa
     */
    private String sFunciones;

    /**
     * Experiencia profesional
     *
     * @param nIdExperienciaProfesional El identificador de la experiencia
     * profesional
     * @param nIdCV El identificador para el CV
     * @param sEmpresa El nombre de la empresa donde se laboró
     * @param sGiro El giro de la empresa
     * @param sPuesto El puesto que se tenía en dicha empresa
     * @param dFechaIngreso La fecha de ingreso a la empresa antes mencionada
     * @param dFechaSalida La fecha de salida de la empresa antes mencionada
     * @param bPuestoActual si este es o no el puesto donde actualmente se
     * labora
     * @param sFunciones Las funciones desempeñadas en dicha posición
     */
    public ExperienciaProfesional(int nIdExperienciaProfesional, int nIdCV, String sEmpresa, String sGiro, String sPuesto, Fecha dFechaIngreso, Fecha dFechaSalida, boolean bPuestoActual, String sFunciones) {
        this.nIdExperienciaProfesional = nIdExperienciaProfesional;
        this.nIdCV = nIdCV;
        this.sEmpresa = sEmpresa;
        this.sGiro = sGiro;
        this.sPuesto = sPuesto;
        this.dFechaIngreso = dFechaIngreso;
        this.dFechaSalida = dFechaSalida;
        this.bPuestoActual = bPuestoActual;
        this.sFunciones = sFunciones;
    }

    @Override
    public String toString() {
        return "ExperienciaProfesional{" + "nIdExperienciaProfesional=" + getnIdExperienciaProfesional() + ", nIdCV=" + getnIdCV() + ", sEmpresa=" + getsEmpresa() + ", sGiro=" + getsGiro() + ", sPuesto=" + getsPuesto() + ", dFechaIngreso=" + getdFechaIngreso() + ", dFechaSalida=" + getdFechaSalida() + ", bPuestoActual=" + isbPuestoActual() + ", sFunciones=" + getsFunciones() + '}';
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException {

        try {
            Conexion con = new Conexion();

            String expprof = getdFechaSalida() == null ? null : "'" + getdFechaSalida().toString() + "'";
            String query = "select ";
            if (getnIdExperienciaProfesional() == -1) {
                query += "addCVExperienciaProfesional(" + getnIdCV();
                query += ", '" + getsEmpresa() + "'";
                query += ", '" + getsGiro() + "'";
                query += ", '" + getsPuesto() + "'";
                query += ", '" + getdFechaIngreso().toString() + "'";
                query += ", " + expprof + "";
                query += ", " + isbPuestoActual() + "";
                query += ", '" + getsFunciones() + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    ResultSet r = con.exec(query);
                    while (r.next()) {
                        int resultado = r.getInt("addCVExperienciaProfesional");
                        this.nIdExperienciaProfesional = resultado;
                    }
                }

            } else {

                query += "updateExperienciaProfesional(" + getnIdExperienciaProfesional();
                query += ", '" + getsEmpresa() + "'";
                query += ", '" + getsGiro() + "'";
                query += ", '" + getsPuesto() + "'";
                query += ", '" + getdFechaIngreso().toString() + "'";
                query += ", " + expprof + "";
                query += ", " + isbPuestoActual() + "";
                query += ", '" + getsFunciones() + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }
            }

            con.close();
        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Formacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo guardar el elemento: Experiencia Profesional");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Experiencia Profesional");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {
            Conexion con = new Conexion();
            String query = "select deleteExperienciaProfesional( " + getnIdExperienciaProfesional() + " );";
            con.exec(query);
            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Experiencia Profesional");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {

        //nuevo
        ExperienciaProfesional f = new ExperienciaProfesional(-1, 1, "COCA COLA", "giro", "puesto", new Fecha(2012, 02, 18), null, true, "funciones");
        f.save();

        //f.delete();

        System.out.println(f);
    }

    /**
     * @return the nIdExperienciaProfesional
     */
    public int getnIdExperienciaProfesional() {
        return nIdExperienciaProfesional;
    }

    /**
     * @return the nIdCV
     */
    public int getnIdCV() {
        return nIdCV;
    }

    /**
     * @return the sEmpresa
     */
    public String getsEmpresa() {
        return sEmpresa;
    }

    /**
     * @param sEmpresa the sEmpresa to set
     */
    public void setsEmpresa(String sEmpresa) {
        this.sEmpresa = sEmpresa;
    }

    /**
     * @return the sGiro
     */
    public String getsGiro() {
        return sGiro;
    }

    /**
     * @param sGiro the sGiro to set
     */
    public void setsGiro(String sGiro) {
        this.sGiro = sGiro;
    }

    /**
     * @return the sPuesto
     */
    public String getsPuesto() {
        return sPuesto;
    }

    /**
     * @param sPuesto the sPuesto to set
     */
    public void setsPuesto(String sPuesto) {
        this.sPuesto = sPuesto;
    }

    /**
     * @return the dFechaIngreso
     */
    public Fecha getdFechaIngreso() {
        return dFechaIngreso;
    }

    /**
     * @param dFechaIngreso the dFechaIngreso to set
     */
    public void setdFechaIngreso(Fecha dFechaIngreso) {
        this.dFechaIngreso = dFechaIngreso;
    }

    /**
     * @return the dFechaSalida
     */
    public Fecha getdFechaSalida() {
        return dFechaSalida;
    }

    /**
     * @param dFechaSalida the dFechaSalida to set
     */
    public void setdFechaSalida(Fecha dFechaSalida) {
        this.dFechaSalida = dFechaSalida;
    }

    /**
     * @return the bPuestoActual
     */
    public boolean isbPuestoActual() {
        return bPuestoActual;
    }

    /**
     * @param bPuestoActual the bPuestoActual to set
     */
    public void setbPuestoActual(boolean bPuestoActual) {
        this.bPuestoActual = bPuestoActual;
    }

    /**
     * @return the sFunciones
     */
    public String getsFunciones() {
        return sFunciones;
    }

    /**
     * @param sFunciones the sFunciones to set
     */
    public void setsFunciones(String sFunciones) {
        this.sFunciones = sFunciones;
    }
}
